#include <iostream>

/**
 * @Author Bob
 * @Eamil 0haizhu0@gmail.com
 * @Date 2017/7/3
 */
int main() {
  /**
   * 指针是指向另外一种类型的符合类型。与引用相比，指针也实现了对其他对象的间接访问。
   * 然而指针与引用相比，又有很多不同点：
   * 1. 指针本身就是一个对象，允许对指针进行赋值和拷贝，而且可以先后指向不同的对象
   * 2. 指针无需再定义时赋初值。
   */
  int *ip1, *ip2; // ip1,ip2都是指向int型对象的指针
  double dp, *dp2; // dp2是指向double型对象的指针，dp是double型对象

  /**
   * 获取对象的地址：
   * 指针是存放某个对象的地址，想要获取该地址，需要使用取地址符（操作符&）
   * Bob：& 既是声明引用的标志，也是访问引用地址的方式
   */
  int ival = 42;
  std::cout << ival << std::endl;

  int *p = &ival;

  /**
   * 指针值（即地址），应属于下列4种状态之一：
   * 1. 指向一个对象
   * 2. 指向紧邻对象所占空间的下一个位置
   * 3. 空指针，意味着指针没有指向任何对象
   * 4. 无效指针，也就是上述情况之外的其他值
   */

  /**
   * 利用指针访问对象，使用解引用符（操作符*）来访问该对象
   * Bob：* 既是声明指针的标志，也是访问指针值的方式
   */
  std::cout << p << " => " << *p << std::endl;

  /**
   * 空指针，建议使用如下方式
   */
  int *p1 = nullptr;

  /**
   * *void 指针，能存放任意类型对象的地址
   */
  double obj = 3.14,*pd = &obj;
  void *pv = &obj; // obj可以是任意类型的对象
  pv = pd; // pv可以存放任意类型的指针


  return 0;
}
